// pages/cart/index.js
/**
 * 1获取用户收货地址
 *  * 1绑定点击事件
 *  * 2调用小程序内置 api 获取用户的收货地址 wx.chooseAddress
 *  * 
 * 2获取 用户 对小程序所授予 获取地址的 权限状态 scope
 *  *1 假设 用户点击获取收货地址的提示框 确定 scope为true authSetting: {scope.address: true}
 *
 *  *2 假设用户从未点击获取收获地址的提示框 
 *      * scope为undefined authSetting: {scope.address: undefined} 直接获取收获地址
 * 
 *  *3假设 用户点击获取收货地址的提示框 取消 scope为false
 *        * 导用户自己打开授权设置页面(openSetting) 当用户重新给与获取地址权限的时候
 *        * 获取收货地址
 * 2 页面加载完毕
 *   0 onLoad onShow
 *   1 获取本地存储中的地址数据
 *   2 把数据 设置给data中的一个变量
 * 
 * 3 onShow
 * 	 0 回到了商品详情页 第一次添加商品的时候 收到添加了属性
 *      1 num=1
 *      2 checked=true
 *   1 获取缓存中的购物车数组
 *   2 把购物车数据 填充到data中
 * 4 全选的实现 数据的展示
 *   onshow获取缓存中的购物车数组
 *   根据购物车的商品数据 所有的的商品都被选中 checked=true  全选就被选中
 *   空数组 调用every,返回值就是true
 * 5 总价格和总数量
 *   1都需要商品被选中 才拿来计算
 *   2获取购物车数组
 *   3遍历
 *   4判断商品是否被选中
 *   5总价格 +=商品的单价 * 数量
 *   6总数量 +=商品数量
 * 	 7把计算后的价格和数量  设置回data中即可
 * 6 商品的选中
 *   1绑定change事件
 *   2获取到被修改的商品对象
 *   3商品对象的选中状态 取反
 *   4重新填充回data中和缓存中
 *   5重新计算全选， 总价格 总数量
 * 
 * 7 全选和反选功能
 *   1全选复选框绑定change事件
 *   2获取data中的全选变量 allChecked
 *   3直接取反 allChecked=!allChecked
 *   4遍历购物车数组 让里面商品 选中状态跟随 allChecked 改变而改变
 *   5把购物车数组和allChecked 重新设置回data 把购物车重新设置回缓存中
 * 8 商品数量的编辑功能
 * 	 1 "+"  "-" 绑定同一个点击事件 区分的关键 自定义属性
 *      "+" 就是加1 "+1"
 *      "-" 就是减1 "-1"
 *   2 传递被点击的商品id  goods_id
 *   3 获取data中的购物车数组 来获取需要被修改的商品对象
 * 	 4 当购物车的数量=1 同时用户点击 "-"
 *     弹窗提示(showModal) 询问客户是否要删除
 * 	    确定 
 * 		删除
 * 	 4 直接修改商品对象的数量 num
 * 	 5 把cart数组 重新设置回 缓存中和data中 this.setCart
 * 9 点击结算
 *   1判断有没有收货地址信息
 *   2判断用户有没有选购商品
 *   3经过以上条件  跳转到支付页面
 */
import { openSetting, chooseAddress, getSetting,showModal,showToast } from '../../utils/asyncWX.js';
import regeneratorRuntime from '../../lib/runtime/runtime.js'
Page({
    data: {
		address:{},
		cart:[],
		allChecked: false,
		totalPrice: 0,
		totalNum:0
    },
  	onShow(){
		//获取缓存中的收货地址
		const address =wx.getStorageSync("address");
		//获取缓存中的购物车数组
		const cart =wx.getStorageSync("cart")||[];

		this.setData({address});
		this.setCart(cart);
  	},
  	//点击收货地址
    async handleChooseAddress() {
		try {
			const res1 = await getSetting();
			const scopeAddress = res1.authSetting["scope.address"];
			// 2.判断权限状态
			if (scopeAddress === false) {
				// 用户拒接过授予权限，诱导用户打开授权界面
				await openSetting();
			}
            // 3.调用获取地址API
			const address = await chooseAddress();
			address.all=address.provinceName+address.cityName+address.countyName+address.detailInfo;
			wx.setStorageSync("address", address);
		} catch (err) {
				console.log(err)
		}
	},
	//商品的选中
	handleItemChange(e){
		//获取到被修改的商品对象
		const goods_id=e.currentTarget.dataset.id;
		console.log(goods_id);
		//获取购物车数组
		const {cart}=this.data;
		//找到被修改的商品对象
		let index=cart.findIndex(v=>v.goods_id===goods_id);
		//选中状态 取反
		cart[index].checked=!cart[index].checked;
		//计算
		this.setCart(cart);
		
	},
	//设置购物车同时 重新计算底部工具栏的数据 全选 总价格 总数量（代码封装）
	setCart(cart){
		let allChecked=true;
		//总价格  总数量
		let totalPrice=0;
		let totalNum=0;
		cart.forEach(v => {
			if(v.checked){
				totalPrice+=v.num*v.goods_price;
				totalNum+=v.num;
			}else{
				allChecked=false;
			}
		})
		//判断数组是否为空
		allChecked=cart.length!=0?allChecked:false;
		//把购物车数据重新填充回data中和缓存中
		this.setData({
			cart,
			totalPrice,
			totalNum,
			allChecked
		});
		wx.setStorageSync("cart",cart);
	},
	//商品全选功能
	handleItemAllCheck(){
		//获取data中的数据
		let {cart,allChecked}=this.data;
		//修改值
		allChecked=!allChecked;
		//循环修改cart数组 中的商品选中状态
		cart.forEach(v=>v.checked=allChecked);
		//把修改后的值填回data或缓存中
		this.setCart(cart);
	},
	//商品数量的编辑功能
	async handletemNumEdit(e){
		//获取传递过来的参数
		const {operation,id}=e.currentTarget.dataset;
		//获取购物车数组
		let {cart}=this.data;
		//找到需要修改的商品索引
		const index=cart.findIndex(v=>v.goods_id===id);
		//判断是否要执行删除
		if(cart[index].num===1&&operation===-1){
			const res = await showModal({content: '你是否要删除?'});
			if (res.confirm) {
				cart.splice(index,1);
				this.setCart(cart);
			}
		}else{
			//进行修改数量
		cart[index].num+=operation;
		//重新设置回 缓存中和data中 
		this.setCart(cart)
		}
		
	},
	//结算
	async handlePay(){
		//判断收货地址
		const {address,totalNum}=this.data;
		if(!address.userName){
			await showToast({title:"您还没有选择收货地址"});
			return;
		}
		//判断用户有没有选择商品
		if(totalNum===0){
			await showToast({title:"您还没有选择商品"});
			return;
	   }
	   //跳转到支付页面
	   wx.navigateTo({
		   url:'/pages/pay/index'
	   });
	}
})